package com.powernode.model;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

/**
 * 项目统一响应结果对象
 *
 * @author ZhangYu
 * @date 2024/11/24 3:00
 */
@Data
@ApiModel("项目统一响应结果对象")
@NoArgsConstructor
@AllArgsConstructor
public class Result<T> implements Serializable {


    private static final long serialVersionUID = 1L;

    /**
     * 成功
     */
    public static final int SUCCESS = 200;

    /**
     * 失败
     */
    public static final int FAIL = 500;

    /**
     * 状态码
     */
    @ApiModelProperty("状态码")
    private Integer code;

    /**
     * 响应信息
     */
    @ApiModelProperty("响应信息")
    private String message;

    /**
     * 响应数据
     */
    @ApiModelProperty("响应数据")
    private T data;

    /**
     * 成功
     *
     * @param <T> 响应数据类型
     * @return 项目统一响应结果对象
     */
    public static <T> Result<T> ok() {
        return restResult(null, SUCCESS, null);
    }

    /**
     * 成功
     *
     * @param data 响应数据
     * @param <T>  响应数据类型
     * @return 项目统一响应结果对象
     */
    public static <T> Result<T> ok(T data) {
        return restResult(data, SUCCESS, null);
    }

    /**
     * 成功
     *
     * @param data    响应数据
     * @param message 响应信息
     * @param <T>     响应数据类型
     * @return 项目统一响应结果对象
     */
    public static <T> Result<T> ok(T data, String message) {
        return restResult(data, SUCCESS, message);
    }

    /**
     * 失败
     *
     * @param <T> 响应数据类型
     * @return 项目统一响应结果对象
     */
    public static <T> Result<T> fail() {
        return restResult(null, FAIL, null);
    }

    /**
     * 失败
     *
     * @param message 响应信息
     * @param <T>     响应数据类型
     * @return 项目统一响应结果对象
     */
    public static <T> Result<T> fail(String message) {
        return restResult(null, FAIL, message);
    }

    /**
     * 失败
     *
     * @param data 响应数据
     * @param <T>  响应数据类型
     * @return 项目统一响应结果对象
     */
    public static <T> Result<T> fail(T data) {
        return restResult(data, FAIL, null);
    }

    /**
     * 失败
     *
     * @param data    响应数据
     * @param message 响应信息
     * @param <T>     响应数据类型
     * @return 项目统一响应结果对象
     */
    public static <T> Result<T> fail(T data, String message) {
        return restResult(data, FAIL, message);
    }

    /**
     * 失败
     *
     * @param code    状态码
     * @param message 响应信息
     * @param <T>     响应数据类型
     * @return 项目统一响应结果对象
     */
    public static <T> Result<T> fail(int code, String message) {
        return restResult(null, code, message);
    }

    /**
     * 构建响应结果对象
     *
     * @param data    响应数据
     * @param code    状态码
     * @param message 响应信息
     * @param <T>     响应数据类型
     * @return 响应结果对象
     */
    private static <T> Result<T> restResult(T data, int code, String message) {
        Result<T> apiResult = new Result<>();
        apiResult.setCode(code);
        apiResult.setData(data);
        apiResult.setMessage(message);
        return apiResult;
    }

}
